<?php

/**
 * This is the model class for table "Wizyta".
 *
 * The followings are the available columns in table 'Wizyta':
 * @property integer $idWizyta
 * @property integer $idPacjent
 * @property integer $idLekarz
 * @property string $Termin
 *
 * The followings are the available model relations:
 * @property Lekarz $idLekarz0
 * @property Pacjent $idPacjent0
 */
class Wizyta extends CActiveRecord
{
	public $rejestracjaInfo;
        
        /**
	 * Returns the static model of the specified AR class.
	 * @return Wizyta the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'Wizyta';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('idPacjent, idLekarz, Termin', 'required'),
			array('idPacjent, idLekarz', 'numerical', 'integerOnly'=>true),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('idWizyta, idPacjent, idLekarz, Termin', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'lekarz' => array(self::BELONGS_TO, 'Lekarz', 'idLekarz'),
			'pacjent' => array(self::BELONGS_TO, 'Pacjent', 'idPacjent'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'idWizyta' => 'Id Wizyta',
			'idPacjent' => 'Pacjent',
			'idLekarz' => 'Lekarz',
			'Termin' => 'Termin',
                        'rejestracjaInfo' => 'Zarejestrowany do'
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('idWizyta',$this->idWizyta);
		$criteria->compare('idPacjent',$this->idPacjent);
		$criteria->compare('idLekarz',$this->idLekarz);
		$criteria->compare('Termin',$this->Termin,true);

		return new CActiveDataProvider(get_class($this), array(
			'criteria'=>$criteria,
		));
	}

        /**
	 * Zwraca tablicę dostępnych terminów w danym tygodniu .
         * @param date $tydzien data poniedziałku danego tygodnia
         * @param int $idLekarz ID lekarza dla którego chcemy wyświetlić terminy. Jeśli pozostawimy puste, przyjęte zostanie założenie że lekarz jest dowolny
	 * @return array macierz 7 na 96 (dni x godziny). Każda komórka macierzy zawiera tablicę asocjacyjną
         *               o elementach 'idLekarz' => 'NULL/W/R' (nie pracuje/wolny termin/zarezerwowany termin)
	 */
        public function getDostepneTerminy($tydzien, $idLekarz = NULL) {
                $result = array();

                for ($i = 0; $i < 7; $i++) {
                    $dzien = strtotime(date('Y-m-d', $tydzien+$i*24*60*60));
                    if ($dzien+24*60*60 < time())
                        continue;
                    $result[] = array();
                    $dzienFormated = date('Y-m-d', $dzien);
                    $dzienTygodnia = date('N', $dzien) - 1;
                    $terminy = CzasPracy::model()->findAllBySql("
                        SELECT * FROM `czaspracy` c1
                        WHERE ".($idLekarz ? "c1.idLekarz = ".$idLekarz." AND " : "")."(
                        (
                                c1.Flaga = 'W'
                                AND c1.Data <= '".$dzienFormated."'
                                AND c1.Dzien_tygodnia = ".$dzienTygodnia."
                                AND NOT EXISTS (
                                        SELECT 1 FROM `czaspracy` c2
                                        WHERE (
                                                (
                                                        c2.Data = '".$dzienFormated."'
                                                        AND c2.Flaga = 'D'
                                                ) OR (
                                                        c1.Data < c2.Data
                                                        AND c2.Data <= '".$dzienFormated."'
                                                        AND c2.Dzien_tygodnia = c1.Dzien_tygodnia
                                                        AND c2.Flaga = 'W'
                                                )
                                        )
                                        AND c2.idLekarz = c1.idLekarz
                                )
                        ) OR (
                                c1.Data = '".$dzienFormated."'
                                AND c1.Flaga = 'D'
                        ))");
                    foreach ($terminy as $t) {
                        for ($j = strtotime(date('Y-m-d', $dzien).' '.$t->Godzina_poczatek); $j < strtotime(date('Y-m-d', $dzien).' '.$t->Godzina_koniec); $j+=900) {
                            if ($j < time())
                                continue;

                            $j_ = (int)date('G', $j) * 4 + (int)((int)date('i', $j) / 15);
                            if (!isset($result[$i][$j_])) {
                                $result[$i][$j_] = array();
                            }
                            $result[$i][$j_][$t->idLekarz] = 'W';
                        }
                    }
                }

                if (isset($idLekarz)) {
                    $wizyty = Wizyta::model()->findAll('Termin >= :od AND Termin < :do AND idLekarz = :lekarz',
                        array(':od' => date('Y-m-d', $tydzien).' 00:00:00',
                              ':do' => date('Y-m-d', $tydzien + (7 * 24 * 60 * 60)).' 00:00:00',
                              ':lekarz' => $idLekarz));
                } else {
                    $wizyty = Wizyta::model()->findAll('Termin >= :od AND Termin < :do',
                        array(':od' => date('Y-m-d', $tydzien).' 00:00:00',
                              ':do' => date('Y-m-d', $tydzien + (7 * 24 * 60 * 60)).' 00:00:00'));
                }

                foreach ($wizyty as $w) {
                    $term = strtotime($w->Termin);
                    if ($term < time())
                        continue;
                    $i = date('N', $term)-1;
                    $j = (int)date('G', $term) * 4 + (int)((int)date('i', $term) / 15);
                    $result[$i][$j][$w->idLekarz] = 'R';
                }

                return $result;
        }

        public function monthPLtoNum($m) {
            switch($m) {
                case 'Sty': return 1;
                case 'Lut': return 2;
                case 'Mar': return 3;
                case 'Kwi': return 4;
                case 'Maj': return 5;
                case 'Cze': return 6;
                case 'Lip': return 7;
                case 'Sie': return 8;
                case 'Wrz': return 9;
                case 'Paź': return 10;
                case 'Lis': return 11;
                case 'Gru': return 12;
            }
        }

        public function dayPL($d) {
            switch($d) {
                case 1: return 'poniedziałek';
                case 2: return 'wtorek';
                case 3: return 'środa';
                case 4: return 'czwartek';
                case 5: return 'piątek';
                case 6: return 'sobota';
                case 7: return 'niedziela';

            }
        }

        public function monthPL($m) {
            switch($m) {
                case 1: return 'Sty';
                case 2: return 'Lut';
                case 3: return 'Mar';
                case 4: return 'Kwi';
                case 5: return 'Maj';
                case 6: return 'Cze';
                case 7: return 'Lip';
                case 8: return 'Sie';
                case 9: return 'Wrz';
                case 10: return 'Paź';
                case 11: return 'Lis';
                case 12: return 'Gru';
            }
        }
}